package com.zwh.se.oop.Interface_abstract;

/**
 * @author zwh
 *一个接口可以继承多个父接口
 */
public class InterfaceDemo implements Interface1,Interface2{


    @Override
    public void test1() {
        System.out.println("InterfaceDemo --test1");
    }
    @Override
    public void test2() {
        System.out.println("InterfaceDemo --test2");
    }
    //自己的方法
    public void ownMethod(){
        //尝试调用一下实现的接口中的已实现的非抽象方法
        //super.defaultMethod1();//用不了
        //super.defaultMethod2();//用不了
        //正确的使用姿势
        Interface1.super.defaultMethod1();
        Interface1.defaultMethod2();
    }
}
/**
 * 继承Interface3于实现了 Interface1,Interface2,继承Interface3于实现了三个接口,需要实现所有的抽象方法
 */
class InterfaceDemo2 implements Interface3{


    @Override
    public void test3() {
        System.out.println("InterfaceDemo2 --test3");
    }
    @Override
    public void test1() {
        System.out.println("InterfaceDemo2 --test1");
    }
    @Override
    public void test2() {
        System.out.println("InterfaceDemo2 --test2");
    }

    /**
     *总结：
     * 1、Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)
     * 2、Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化
     * 3、Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法
     * 4、接口中没有构造方法,不能被实例化
     * 5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
     * 6、Java接口必须通过类来实现它的抽象方法
     * 7、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象
     * 8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例
     * 9、 一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.
     * @param args
     */
    public static void main(String[] args) {
        InterfaceDemo interfaceDemo = new InterfaceDemo();
        InterfaceDemo2 interfaceDemo2 = new InterfaceDemo2();
        interfaceDemo.ownMethod();
        System.out.println("-------------------------------");
        Interface1.defaultMethod2();
        interfaceDemo.defaultMethod1();
        interfaceDemo2.test1();
    }
}
